package de.bahn.dbs.diva.provider;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import de.bahn.dbs.diva.db.Auftrag;
import de.bahn.dbs.diva.db.DivaDatabase;
import de.bahn.dbs.diva.db.Vorgang;
import de.bahn.dbs.diva.db.VorgangsMitarbeiter;

public class DivaProvider extends ContentProvider {

	private SQLiteOpenHelper mDivaDatabase;
	public static final String AUTHORITY = "de.bahn.dbs.diva";
	public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);

	private static final int AUFTRAG_ID = 1;
	private static final int AUFTRAG_DIR = 2;
	private static final int VORGANG_ID = 3;
	private static final int VORGANG_DIR = 4;
	private static final int ZEIT_ID = 5;
	private static final int ZEIT_DIR = 6;
	private static final int MATERIAL_ID = 7;
	private static final int MATERIAL_DIR = 8;
	private static final int MITARBEITER_ID = 9;
	private static final int MITARBEITER_DIR = 10;

	private static final UriMatcher sUriMatcher;

	static {
		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		sUriMatcher.addURI(AUTHORITY, Auftrag.CONTENT_URIS.BASE.getPath()
				.substring(1),
				AUFTRAG_DIR);
		sUriMatcher.addURI(AUTHORITY, Auftrag.CONTENT_URIS.BASE.getPath()
				.substring(1)
				+ "/#", AUFTRAG_ID);
		sUriMatcher.addURI(AUTHORITY, Vorgang.CONTENT_URIS.BASE.getPath()
				.substring(1),
				VORGANG_DIR);
		sUriMatcher.addURI(AUTHORITY, Vorgang.CONTENT_URIS.BASE.getPath()
				.substring(1)
				+ "/#", VORGANG_ID);
		sUriMatcher.addURI(AUTHORITY, VorgangsMitarbeiter.CONTENT_URIS.BASE
				.getPath().substring(1), MITARBEITER_DIR);
		sUriMatcher.addURI(AUTHORITY, VorgangsMitarbeiter.CONTENT_URIS.BASE
				.getPath().substring(1) + "/#", MITARBEITER_ID);
	}

	@Override
	public int delete(Uri pUri, String pSelection, String[] pSelectionArgs) {

		return 0;
	}

	@Override
	public String getType(Uri pUri) {
		String type = null;

		switch (sUriMatcher.match(pUri)) {
		case AUFTRAG_DIR:
			type = Auftrag.MIME_TYPE_DIR;
			break;
		case AUFTRAG_ID:
			type = Auftrag.MIME_TYPE_ITEM;
			break;
		case VORGANG_DIR:
			type = Vorgang.MIME_TYPE_DIR;
			break;
		case VORGANG_ID:
			type = Vorgang.MIME_TYPE_ITEM;
			break;
		case MITARBEITER_DIR:
			type = VorgangsMitarbeiter.MIME_TYPE_DIR;
			break;
		case MITARBEITER_ID:
			type = VorgangsMitarbeiter.MIME_TYPE_ITEM;
			break;
		default:
			throw new IllegalArgumentException(
					"Resolving MIME type failed! Unknown URI: " + pUri);
		}

		return type;
	}

	@Override
	public Uri insert(Uri pUri, ContentValues pValues) {
		String table = null;
		Uri baseUri = null;

		switch (sUriMatcher.match(pUri)) {
		case AUFTRAG_DIR:
			table = Auftrag.SQL.TABLE;
			baseUri = Auftrag.CONTENT_URIS.BASE;
			break;
		case VORGANG_DIR:
			table = Vorgang.SQL.TABLE;
			baseUri = Vorgang.CONTENT_URIS.BASE;
			break;
		case MITARBEITER_DIR:
			table = VorgangsMitarbeiter.SQL.TABLE;
			baseUri = VorgangsMitarbeiter.CONTENT_URIS.BASE;
			break;
		default:
			throw new IllegalArgumentException(
					"Resolving MIME type failed! Unknown URI: " + pUri + ", "
							+ Auftrag.CONTENT_URIS.BASE.getPath());
		}

		SQLiteDatabase database = mDivaDatabase.getWritableDatabase();

		long id = database.insert(table, null, pValues);

		if (id < 1) {
			throw new SQLException("Inserting a new row in URI " + pUri
					+ " failed!");
		}

		Uri insertUri = ContentUris.withAppendedId(baseUri, id);

		getContext().getContentResolver().notifyChange(insertUri, null);

		return insertUri;

	}

	@Override
	public boolean onCreate() {
		mDivaDatabase = new DivaDatabase(getContext());
		return false;
	}

	@Override
	public Cursor query(Uri pUri, String[] pProjection, String pSelection,
			String[] pSelectionArgs, String pSortOrder) {
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		String sortOrder = null;

		switch (sUriMatcher.match(pUri)) {
		case AUFTRAG_DIR:
			qb.setTables(Auftrag.SQL.TABLE);
			sortOrder = Auftrag.DEFAULT_SORT_ORDER;
			break;
		case AUFTRAG_ID:
			qb.setTables(Auftrag.SQL.TABLE);
			qb.appendWhere(Auftrag._ID + " = " + pUri.getLastPathSegment());
			sortOrder = Auftrag.DEFAULT_SORT_ORDER;
			break;
		case VORGANG_DIR:
			qb.setTables(Vorgang.SQL.TABLE);
			sortOrder = Vorgang.DEFAULT_SORT_ORDER;
			break;
		case VORGANG_ID:
			qb.setTables(Vorgang.SQL.TABLE);
			qb.appendWhere(Vorgang._ID + " = " + pUri.getLastPathSegment());
			sortOrder = Vorgang.DEFAULT_SORT_ORDER;
			break;
		case MITARBEITER_DIR:
			qb.setTables(VorgangsMitarbeiter.SQL.TABLE);
			sortOrder = VorgangsMitarbeiter.DEFAULT_SORT_ORDER;
			break;
		case MITARBEITER_ID:
			qb.setTables(VorgangsMitarbeiter.SQL.TABLE);
			qb.appendWhere(VorgangsMitarbeiter._ID + " = "
					+ pUri.getLastPathSegment());
			sortOrder = VorgangsMitarbeiter.DEFAULT_SORT_ORDER;
			break;
		default:
			throw new IllegalArgumentException(
					"Resolving MIME type failed! Unknown URI: " + pUri + ", "
							+ Auftrag.CONTENT_URIS.BASE.getPath());
		}

		SQLiteDatabase db = mDivaDatabase.getReadableDatabase();

		Cursor cursor = qb.query(db, pProjection, pSelection, pSelectionArgs,
				null, null, pSortOrder == null ? sortOrder : pSortOrder);
		cursor.setNotificationUri(getContext().getContentResolver(), pUri);

		return cursor;
	}

	@Override
	public int update(Uri pUri, ContentValues pValues, String pSelection,
			String[] pSelectionArgs) {
		StringBuilder where = new StringBuilder();
		String table = null;
		
		switch (sUriMatcher.match(pUri)) {
		case AUFTRAG_DIR:
			table = Auftrag.SQL.TABLE;
			break;
		case AUFTRAG_ID:
			table = Auftrag.SQL.TABLE;
			where.append(Auftrag._ID + " = " + pUri.getLastPathSegment());
			break;
		case VORGANG_DIR:
			table = Vorgang.SQL.TABLE;
			break;
		case VORGANG_ID:
			table = Vorgang.SQL.TABLE;
			where.append(Vorgang._ID + " = " + pUri.getLastPathSegment());
			break;
		case MITARBEITER_DIR:
			table = VorgangsMitarbeiter.SQL.TABLE;
			break;
		case MITARBEITER_ID:
			table = VorgangsMitarbeiter.SQL.TABLE;
			where.append(VorgangsMitarbeiter._ID + " = "
					+ pUri.getLastPathSegment());
			break;
		default:
			throw new IllegalArgumentException(
					"Resolving MIME type failed! Unknown URI: " + pUri + ", "
							+ Auftrag.CONTENT_URIS.BASE.getPath());
		}

		SQLiteDatabase db = mDivaDatabase.getWritableDatabase();

		if (!TextUtils.isEmpty(pSelection)) {
			if (TextUtils.isEmpty(where)) {
				where.append(pSelection);
			} else {
				where.append(" AND ").append(pSelection);
			}
		}
		
		db.update(table, pValues, where.toString(), pSelectionArgs);
		getContext().getContentResolver().notifyChange(pUri, null);

		return 0;
	}

}
